home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Deutsche Edition 1
/
Deutsche Edition 1.iso
/
amok
/
amok_lha
/
amok72.lha
/
while-Interpreter
/
Source
/
QuadBerechneQuadRek.MOD
< prev
next >
Wrap
Text File
|
1993-08-15
|
5KB
|
142 lines
(******************************
* Programm von Dieter Seidel *
* Eingegeben am 14.11.1991 *
******************************)
IMPLEMENTATION MODULE QuadBerechneQuad;
FROM InOut IMPORT WriteCard, WriteLn, Write, WriteString;
FROM QuadLese IMPORT MaxBefehle, MaxQuad, MaxZeile,
arrZeile, QuadZeile, arrQuad, arrList;
FROM QuadHoleBefehle IMPORT HoleZuweisung, HoleSchleife;
PROCEDURE BerechneQuad( BefehlsListe : arrList;
VAR QuadListe : arrQuad);
VAR i,
whileCounter : CARDINAL;
whileZaehler : ARRAY [1..MaxBefehle] OF CARDINAL;
beginZaehler : ARRAY [1..MaxBefehle] OF BOOLEAN;
PROCEDURE BerechneQuadRek( BefehlsListe : arrList;
VAR QuadListe : arrQuad;
VAR Zeiger : CARDINAL;
Zaehler : CARDINAL) : CARDINAL;
VAR ZaehlerAlt : CARDINAL;
BEGIN
(**)
IF Zaehler > 20 THEN RETURN Zaehler; END;
(**)
IF BefehlsListe[Zeiger] = "b" THEN
INC(Zeiger);
Zaehler:=BerechneQuadRek(BefehlsListe,QuadListe,Zeiger,Zaehler);
END;
IF BefehlsListe[Zeiger] = "X" THEN
HoleZuweisung(QuadListe[Zaehler].Befehl,BefehlsListe,Zeiger);
QuadListe[Zaehler].Zeile:=Zaehler;
QuadListe[Zaehler].IFzeile:=Zaehler+1;
QuadListe[Zaehler].ELSEzeile:=Zaehler+1;
RETURN BerechneQuadRek(BefehlsListe,QuadListe,Zeiger,Zaehler+1);
END;
IF BefehlsListe[Zeiger] = "w" THEN
INC(Zeiger);
HoleSchleife(QuadListe[Zaehler].Befehl,BefehlsListe,Zeiger);
QuadListe[Zaehler].Zeile:=Zaehler;
QuadListe[Zaehler].IFzeile:=Zaehler+1;
QuadListe[Zaehler].ELSEzeile:=Zaehler+2;
ZaehlerAlt:=Zaehler;
INC(Zaehler);
IF BefehlsListe[Zeiger] = "X" THEN
HoleZuweisung(QuadListe[Zaehler].Befehl,BefehlsListe,Zeiger);
QuadListe[Zaehler].Zeile:=Zaehler;
QuadListe[Zaehler].IFzeile:=ZaehlerAlt;
QuadListe[Zaehler].ELSEzeile:=ZaehlerAlt;
IF whileCounter # 0 THEN
IF beginZaehler[whileCounter] THEN
RETURN Zaehler+1;
ELSE
QuadListe[ZaehlerAlt].ELSEzeile:=whileZaehler[whileCounter];
(* DEC(whileCounter);*)
RETURN Zaehler+1;
END;
ELSE
RETURN BerechneQuadRek(BefehlsListe,QuadListe,Zeiger,Zaehler+1);
END;
ELSE
IF BefehlsListe[Zeiger] = "w" THEN
INC(whileCounter);
whileZaehler[whileCounter]:=ZaehlerAlt;
beginZaehler[whileCounter]:=FALSE;
Zaehler:=BerechneQuadRek(BefehlsListe,QuadListe,Zeiger,Zaehler);
IF whileCounter # 0 THEN
DEC(whileCounter);
IF NOT(beginZaehler[whileCounter]) THEN
RETURN BerechneQuadRek(BefehlsListe,QuadListe,Zeiger,Zaehler+1);
ELSE
QuadListe[ZaehlerAlt].ELSEzeile:=whileZaehler[whileCounter];
RETURN Zaehler+1;
END;
ELSE
QuadListe[ZaehlerAlt].ELSEzeile:=Zaehler;
RETURN BerechneQuadRek(BefehlsListe,QuadListe,Zeiger,Zaehler);
END;
ELSE
IF BefehlsListe[Zeiger] = "b" THEN
INC(whileCounter);
whileZaehler[whileCounter]:=ZaehlerAlt;
beginZaehler[whileCounter]:=TRUE;
INC(Zeiger);
Zaehler:=BerechneQuadRek(BefehlsListe,QuadListe,Zeiger,Zaehler);
QuadListe[ZaehlerAlt].ELSEzeile:=Zaehler;
DEC(whileCounter);
RETURN BerechneQuadRek(BefehlsListe,QuadListe,Zeiger,Zaehler);
ELSE
WriteLn;
WriteString("Fehler in BerechneQuadRek!!!");
WriteLn;
HALT;
END;
END;
RETURN Zaehler;
END;
END;
IF BefehlsListe[Zeiger] = "e" THEN
IF beginZaehler[whileCounter] THEN
QuadListe[Zaehler-1].IFzeile:=whileZaehler[whileCounter];
QuadListe[Zaehler-1].ELSEzeile:=whileZaehler[whileCounter];
beginZaehler[whileCounter]:=FALSE;
END;
INC(Zeiger);
IF BefehlsListe[Zeiger] = ";" THEN INC(Zeiger) END;
RETURN Zaehler;
END;
WriteLn;
WriteString("Fehler in BerechneQuadRek!!! ");WriteCard(Zaehler,5);
WriteLn;
(* HALT;*)
RETURN Zaehler;
END BerechneQuadRek;
BEGIN (* BerechneQuad *)
i:=1;
whileCounter:=0;
i:=BerechneQuadRek(BefehlsListe,QuadListe,i,1);
QuadListe[i].Zeile:=0;
QuadListe[i].IFzeile:=0;
QuadListe[i].ELSEzeile:=0;
QuadListe[i].Befehl:="";
END BerechneQuad;
END QuadBerechneQuad.